/*
 * 版权所有 ( c ) 联想集团有限公司 2005-2009 保留所有权利。
 * 项目：	Lenovo Push Service
 * 文件名：	ToStringUtil.java
 * 版本:    1.0
 * 描述：	
 * 作者：	刘兵召
 * 日期：	May 6, 2010 
 * 修改历史：
 * 【时间】		【修改者】	【修改内容】
 */
package com.feng.util;

import java.beans.PropertyDescriptor;
import java.io.UnsupportedEncodingException;

import org.apache.commons.beanutils.PropertyUtils;

public class StringUtil {

	/**
	 * 用字符串的形式打印出Object对像的属性和值
	 * 
	 * @param obj
	 * @return 字符串
	 */
	public static String toStringBuilder(Object obj) {
		StringBuffer buff;
		Object value;
		buff = new StringBuffer("");
		value = null;
		if (obj == null)
			return "[null]";
		try {
			buff.append((new StringBuilder()).append("\n[").append(
					obj.getClass()).toString());
			PropertyDescriptor origDescriptors[] = PropertyUtils
					.getPropertyDescriptors(obj);
			for (int i = 0; i < origDescriptors.length; i++) {
				String name = origDescriptors[i].getName();
				String type = origDescriptors[i].getPropertyType().getName();
				if ("class".equals(name))
					continue;
				if (PropertyUtils.isReadable(obj, name))
					value = PropertyUtils.getSimpleProperty(obj, name);
				buff.append("\n |-");
				if (isPrintable(type)) {
					buff.append((new StringBuilder()).append(name).append(":")
							.append(value).toString());
					continue;
				}
				if (value == null)
					buff.append((new StringBuilder()).append(name).append(
							":null").toString());
				else
					buff.append((new StringBuilder()).append(name).append(":")
							.append(type).toString());
			}

			buff.append("\n]");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return buff.toString();
	}

	/**
	 * 字符串 转 Unicode
	 * 
	 * @param 需要转换的字符串
	 * @return Unicode字符串
	 */
	static String string2Unicode(String s) {
		try {
			StringBuffer out = new StringBuffer("");
			byte[] bytes = s.getBytes("unicode");
			for (int i = 2; i < bytes.length - 1; i += 2) {
				out.append("u");
				String str = Integer.toHexString(bytes[i + 1] & 0xff);
				for (int j = str.length(); j < 2; j++) {
					out.append("0");
				}
				String str1 = Integer.toHexString(bytes[i] & 0xff);

				out.append(str);
				out.append(str1);
				out.append(" ");
			}
			return out.toString().toUpperCase();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * Unicode 转 String
	 * 
	 * @param unicodeStr
	 * @return
	 */
	static String unicode2String(String unicodeStr) {
		StringBuffer sb = new StringBuffer();
		String str[] = unicodeStr.toUpperCase().split("U");
		for (int i = 0; i < str.length; i++) {
			if (str[i].equals(""))
				continue;
			char c = (char) Integer.parseInt(str[i].trim(), 16);
			sb.append(c);
		}
		return sb.toString();
	}

	/**
	 * 把中文转成Unicode码
	 * 
	 * @param str
	 * @return
	 */
	static String chinaToUnicode(String str) {
		String result = "";
		for (int i = 0; i < str.length(); i++) {
			int chr1 = (char) str.charAt(i);
			if (chr1 >= 19968 && chr1 <= 171941) {// 汉字范围 \u4e00-\u9fa5 (中文)
				result += "\\u" + Integer.toHexString(chr1);
			} else {
				result += str.charAt(i);
			}
		}
		return result;
	}

	/**
	 * 判断是否为中文字符
	 * 
	 * @param chr
	 * @return 是:true/否:false
	 */
	static boolean isChinese(char chr) {
		Character.UnicodeBlock ub = Character.UnicodeBlock.of(chr);
		if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
				|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
				|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
				|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
				|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
				|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
			return true;
		}
		return false;
	}

	/**
	 * 判断指定属性类型的值是否允许打印
	 * 
	 * @param type
	 *            属性类型
	 * @return true/false(true:允许打印；false:不允许打印；)
	 */
	private static boolean isPrintable(String type) {
		if ("byte".equals(type) || "short".equals(type) || "int".equals(type)
				|| "long".equals(type) || "float".equals(type)
				|| "double".equals(type) || "char".equals(type)
				|| "boolean".equals(type))
			return true;
		if ("java.lang.Byte".equals(type) || "java.lang.Short".equals(type)
				|| "java.lang.Integer".equals(type)
				|| "java.lang.Long".equals(type)
				|| "java.lang.Float".equals(type)
				|| "java.lang.Double".equals(type)
				|| "java.lang.Character".equals(type)
				|| "java.lang.Boolean".equals(type))
			return true;
		if ("java.lang.String".equals(type) || "java.util.Date".equals(type))
			return true;
		else
			return false;
	}
}
